package dao;

import java.sql.Connection;  
import java.sql.ResultSet;  
import java.sql.SQLException;  
import java.sql.Statement;  
import java.util.Vector;
import javax.swing.JOptionPane;  
import modelo.dominio.Pessoa;
import modelo.dominio.Endereco;
import dao.banco.ConFactory;  
import modelo.dominio.Cliente;
  
   public class DaoPessoa {  
 
   private final String URL = "jdbc:mysql://localhost/bd_locarrao",  
         NOME = "root", SENHA = "locarrao2";  
  
   private Connection con;  
   private Statement comando;  
  
   public void apagar(String cpf) {  
      conectar();  
      try {  
         comando  
               .executeUpdate("DELETE FROM pessoa WHERE cpf = '" + cpf  
                     + "';");  
      } catch (SQLException e) {  
         imprimeErro("Erro ao apagar pessoas", e.getMessage());  
      } finally {  
         fechar();  
      }  
   }  
  
   /**
    * busca no banco de dados todas pessoas
    * @return vetor das pessoas
    */
   public Vector<Pessoa> buscarTodos() {  
      conectar();  
      Vector<Pessoa> resultados = new Vector<Pessoa>();  
      ResultSet rs;  
      try {  
         rs = comando.executeQuery("SELECT * FROM tb_pessoa");  
         while (rs.next()) {  
            Pessoa temp = new Pessoa();
            temp.setCodCliente(rs.getInt("cod_cliente"));
            temp.setCpf(rs.getString("cpf"));  
            temp.setNome(rs.getString("nome"));  
            temp.setTelefone(rs.getString("telefone"));  
            resultados.add(temp);  
         }  
         return resultados;  
      } catch (SQLException e) {  
         imprimeErro("Erro ao buscar pessoas", e.getMessage());  
         return null;  
      }  
   }  
  
      public Pessoa buscarClienteCod(int cod) {  
      conectar();  
      Pessoa temp = new Pessoa();  
      ResultSet rs;  
      try {  
         rs = comando.executeQuery("SELECT * FROM tb_pessoa WHERE cod_cliente LIKE '" + cod + "%';");
         while (rs.next()) {  
            temp.setNome(rs.getString("nome"));              
         }
         return temp;
      } catch (SQLException e) {  
         imprimeErro("Erro ao buscar o veiculo.", e.getMessage());  
         return null;  
      }  
  
   }
   
   public void atualizar(Pessoa pessoa) {  
      conectar();  
      String com = "UPDATE pessoa SET nome = '" + pessoa.getNome()  
            + "', telefone ='" + pessoa.getTelefone()  
            + "' WHERE  rg = '" + pessoa.getCpf() + "';";  
      System.out.println("Atualizada!");  
      try {  
         comando.executeUpdate(com);  
      } catch (SQLException e) {  
         e.printStackTrace();  
      } finally {  
         fechar();  
      }  
   }  
  
   /**
    * busca uma determinada pessoa pelo cpf
    * @param cpf parametro de busca
    * @return vetor de pessoa do cpf
    */
   public Vector<Pessoa> buscar(String cpf) {  
      conectar();  
      Vector<Pessoa> resultados = new Vector<Pessoa>();  
      ResultSet rs;  
      try {  
         rs = comando.executeQuery("SELECT * FROM pessoa WHERE cpf LIKE '"  
               + cpf + "%';");  
         while (rs.next()) {  
            Pessoa temp = new Pessoa();  
            temp.setCodCliente(rs.getInt("cod_cliente"));
            temp.setCpf(rs.getString("cpf"));  
            temp.setNome(rs.getString("nome"));  
            temp.setTelefone(rs.getString("telefone"));  
            resultados.add(temp);  
         }  
         return resultados;  
      } catch (SQLException e) {  
         imprimeErro("Erro ao buscar pessoa", e.getMessage());  
         return null;  
      }  
  
   }  
   
   /**
    * busca de cliente por nome, como ele é uma herança de pessoa a busca tem que
    * ser feita no pessoa.
    * @param nome o nome que deseja ser procurado no banco de dados.
    * @return vetor de pessoa com determinado nome.
    */
   public Vector<Pessoa> buscarClientePorNome(String nome) { 
      conectar();  
      Vector<Pessoa> resultados = new Vector<Pessoa>();  
      ResultSet rs;
      try {  
         rs = comando.executeQuery("SELECT * FROM tb_pessoa WHERE nome LIKE '"  
               + nome + "%';");
            while (rs.next()) {   
                Pessoa temp = new Pessoa();
                temp.setCodCliente(rs.getInt("cod_cliente"));
                temp.setCodTipoPessoa(Integer.parseInt(rs.getString("cod_tipo_pessoa")));
                temp.setCpf(rs.getString("cpf"));             
                temp.setNome(rs.getString("nome"));  
                temp.setTelefone(rs.getString("telefone"));
                if (temp.getCodTipoPessoa()==1) {
                    resultados.add(temp); 
                }
            }
         return resultados;  
      } catch (SQLException e) {  
         imprimeErro("Erro ao buscar pessoa", e.getMessage());  
         return null;  
      }  
   }
   /**
    * insere uma pessoa no banco de dados
    * @param pessoa pessoa a ser inserida
    * @param cod codigo relacionado
    * @param cod2 coidgo relacionado 
    */
   public void insere(Pessoa pessoa, int cod, int cod2){  
      conectar();  
      try {    
         comando.executeUpdate("INSERT INTO `bd_locarrao`.`tb_pessoa` (`cpf`, `telefone`, `cod_endereco`, `nome`,`cod_tipo_pessoa`,`cod_cliente`) VALUES ('" + pessoa.getCpf() + "', '" + pessoa.getTelefone()+"','"+ cod+"', '" + pessoa.getNome()+ "','"+ 1 +"','"+cod2+"')");
         System.out.println("Inserida!");
      } catch (SQLException e) {  
         imprimeErro("Erro ao inserir Pessoa", e.getMessage());  
      } finally {  
         fechar();
      }  
   }  
   /**
    * codigo para inserir um cliente
    * @param pessoa relacionamento com pessoa
    * @param codEndereco  endereço relacionado a essa pessoa
    * @param codCliente codigo desse cliente
    */
    public void insereCliente(Pessoa pessoa, int codEndereco, int codCliente){  
      conectar();  
      try {    
         
         comando.executeUpdate("INSERT INTO `bd_locarrao`.`tb_pessoa` (`cpf`, `telefone`, `cod_endereco`, `nome`,`cod_tipo_pessoa`,`cod_cliente`, `cod_funcionario`, `cod_motorista`) VALUES ('" + pessoa.getCpf() + "', '" + pessoa.getTelefone()+"','"+ codEndereco+"', '" + pessoa.getNome()+ "','"+ 1 +"','"+ codCliente +"','"+ 0 +"','"+ 0 +"')");
         System.out.println("Inserida!");
      } catch (SQLException e) {  
         imprimeErro("Erro ao inserir Pessoa", e.getMessage());  
      } finally {  
         fechar();
      }  

   }
    
        public void insereFuncionario(Pessoa pessoa, int codEndereco, int codFuncionario){  
      conectar();  
      try {    
         
         comando.executeUpdate("INSERT INTO `bd_locarrao`.`tb_pessoa` (`cpf`, `telefone`, `cod_endereco`, `nome`,`cod_tipo_pessoa`,`cod_cliente`, `cod_funcionario`, `cod_motorista`) VALUES ('" + pessoa.getCpf() + "', '" + pessoa.getTelefone()+"','"+ codEndereco+"', '" + pessoa.getNome()+ "','"+ 2 +"','"+ 0 +"','"+ codFuncionario +"','"+ 0 +"')");
         System.out.println("Inserida!");
      } catch (SQLException e) {  
         imprimeErro("Erro ao inserir Pessoa", e.getMessage());  
      } finally {  
         fechar();
      }  
   }
        
                public void insereMotorista(Pessoa pessoa, int codEndereco, int codMotorista){  
      conectar();  
      try {    
         
         comando.executeUpdate("INSERT INTO `bd_locarrao`.`tb_pessoa` (`cpf`, `telefone`, `cod_endereco`, `nome`,`cod_tipo_pessoa`,`cod_cliente`, `cod_funcionario`, `cod_motorista`) VALUES ('" + pessoa.getCpf() + "', '" + pessoa.getTelefone()+"','"+ codEndereco+"', '" + pessoa.getNome()+ "','"+ 2 +"','"+ 0 +"','"+ 0 +"','"+ codMotorista +"')");
         System.out.println("Inserida!");
      } catch (SQLException e) {  
         imprimeErro("Erro ao inserir Pessoa", e.getMessage());  
      } finally {  
         fechar();
      }  
   }


/**
     * conecta com o banco de dados.
     */

   private void conectar() {  
      try {  
         con = ConFactory.conexao(URL, NOME, SENHA, ConFactory.MYSQL);  
         comando = con.createStatement();  
         System.out.println("Conectado!");  
      } catch (ClassNotFoundException e) {  
         imprimeErro("Erro ao carregar o driver", e.getMessage());  
      } catch (SQLException e) {  
         imprimeErro("Erro ao conectar", e.getMessage());  
      }  
   }  
   
   /**
    * fecha o banco de dados.
    */
   private void fechar() {  
      try {  
         comando.close();  
         con.close();  
         System.out.println("Conexão Fechada");  
      } catch (SQLException e) {  
         imprimeErro("Erro ao fechar conexão", e.getMessage());  
      }  
   }  
  
   private void imprimeErro(String msg, String msgErro) {  
      JOptionPane.showMessageDialog(null, msg, "Erro crítico", 0);  
      System.err.println(msg);  
      System.out.println(msgErro);  
      System.exit(0);  
   }  
}  
